package com.ry.bhwktapp.home.ui

class Kt007 {


}
//TODO 编译时常量的使用  这个只能写在函数之外，就可以在编译期间初始化
const val PI = 3.14f

fun main() {
    println("=====&&Hello World!")
    //Todo 变量声明
    var name: String = "边洪旺"
    name = "谦虚点说++我是小菜鸡"//赋值
    println("88888*" + name)

    //TODO============内置数据类型
    /**
     * Int
    Double
    Float
    String
    Char
    Boolean
    List
    Set
     */

    //TODO=====语言的只读变量
    val age = 25
    println(age)

    //TODO=====kotlin语言的类型推断
    var pric = "124"
    var page = 0
    var isOK = true

    Int

//TODO var 是可变量 val 不是常量，他只是只读变量 常量需要在val 前加上const  但const 不适用与局部变量

//    java 有两种数据类型 基本数据类型(int) 和 引用数据类型（String）
//    kotlin 只有一种数据类型（看起来像引用数据类型，其实会自动转成java的各种类型）



//TODO when kotin 语言的表达式（表达式是有返回值的，java的when是语句，没有表达式）
    var week  = 55
    val s = when (week) {
        1 -> "今天是周一，充实的一天！"
        2 -> "今天是周二，充实的一天！"
        3 -> "今天是周三，充实的一天！"
        4 -> "今天是周四，充实的一天！"
        else -> {
            println("养猪去了，忽略星期几！")
        }
    }
    println(s)

    //TODO ===============字符串模板
    val namePat ="黄石公园"
    val time =2022
    println("今天是周日，我去${namePat}玩了${time}个小时")

    val iskk= false
    println("&&&&&&&&&&&&&&&& ${if(iskk)"今天是个好日子，适合抓蚯蚓" else "今天大晴天，蚯蚓躲在底线睡觉呢！"}")


    //TODO===================kotlin函数头的使用
    method01(24,"旺旺")
    method02(10000,"旺旺")
    method02(22)
    method02(name="旺旺")//具名函数
    method02(22,"旺旺")
    method02()

    //TODO===================kotlin具名参数的使用（顺序可以随便调）
    method03(12,"我",true,3.14f)
    method03(age=42, isFW = true, many = 3.14f, name = "马斯克")//顺序可以随便调



//TODO kotlin语言Unit函数特点
 testUnit()

//TODO kotlin语言Nothing关键字的使用 TODO 直接报错终止
    method04()

    //TODO kotlin语言中反引号`的特点 第一种用法 汉字做方法名
    `在反引号的加持下，方法名可以是汉字的`("校长",68)
    //TODO kotlin语言中反引号`的特点 第二种用法 转译kt中的关键字 in 和 is 等 （调用java中的方法）
    KTBase21.`in`()
    KTBase21.`is`()
    //TODO kotlin语言中反引号`的特点 第三种用法 纯数字做方法名（适用于公司加密的核心代号）
    `454566111GG`()



    //TODO kotlin 语言中的匿名函数使用
    val count = "Derry".count()
    println(count)  // 长度是5
    //这就是匿名函数
    val count1 = "Derry".count {
        it == 'r'
    }
    println(count1)//长度是2，因为只有两个r

    //TODO kotin语言中隐式返回的使用 仔细研究你会发现，它不需要在main函数外写方法，就能调用
//第一步：声明
    val  method05 : () -> String
//第二步：实现
    method05 ={
        val inputValue = 6666
        "$inputValue 旺旺"  // 等价于 return "$inputValue 旺旺"
        //匿名函数不要写return 因为最后一行就是返回值!!!!!
    }
//第三步：调用
    println(method05())

    //TODO kotlin 语言的函数参数学习 （上一个知识点的更高级用法）
//    第一步声明
    val method06:(Int,Int,Int) ->String = {age1,age2,age3 ->
        val inPutValue = "8888"
        "$inPutValue Derry 参数一：$age1,参数二：$age2 参数三：$age3"
    }
//第二步：调用
    println(method06(11,22,33))


    //TODO   kotlin语言中it 关键字的使用（匿名函数中只有一个参数时候it就是它）
//    声明
    val method07:(Int) ->String = {
        val inPutValue = "8888"
        "$inPutValue Derry 参数一：$it"
    }
//调用
    println(method07(1500))//与下面的方法一样
    println(method07.invoke(1500))//这两种方法是等价的


//TODO   kotlin语言中匿名函数的类型自动推断（比上面更高级的用法，上面的写法不合格）
//匿名函数返回类型为String
//方法名 ： 的形式写，必须指定参数类型和返回类型 否则报错
/*    val method8:() ->  ={ 直接报错

    }*/
//    高级写法 = 号  返回类型会自动推断出来（取决于你自己最后一行写什么的类型）
    val method8 = {n1:Int,n2:Int,n3:Int ->
//        true//Boolean
//        65//Int
        "蚯蚓开始出洞了，$n1 后面跟着 $n2 和$n3"//String
    }

//相当于输入：（Int ,Int,Int） ->String
 println(method8.invoke(12,13,14))

    val method09={
        253.26f
    }//相当于 入参（） 输出Unit
    println(method09())

    val method10={ age:Int ->
      age
    }//相当于 入参（Int） 输出 Int
    println(method10(10))

    //TODO kotlin语言lambda表达式的使用
//匿名函数==lambda表达式
    val method11 = { num1:Int,num2:Int ->
        "两数相加的和是${num1+num2}"
    }//相当于 入参（Int,Int） -> String
    println(method11(1,10))


//    匿名函数参数（Int）     返回值 Any
//    lambda表达式参数 Int   lambda表达式结果 Any
    val resultMethod = {num:Int->
        when(num){
            1->"今天是周1，好好干"
            2->"今天是周2，好好干"
            3->"今天是周3，好好干"
            4->"今天是周4，好好干"
            5->"今天是周5，好好干"
            else -> -1
        }//相当于入参（Int） -> Any
    }
//    总结：匿名函数属于lambda
    println(resultMethod(2))


}

//kotlin函数
fun  method01(age: Int, name: String) :Int{
    println("你的年龄是$age,你的名字是$name")
   return 10000
}

//函数参数的默认值
private fun method02(age: Int=9999, name: String="小旺"){
    println("你的年龄是$age,你的名字是$name")
}

//TODO===================kotlin具名参数的使用（顺序可以随便调）
fun method03(age: Int, name: String, isFW: Boolean, many: Float) {
    println("age:$age,name:$name,isFW:$isFW,many:$many")
}


//TODO kotlin语言Unit函数特点   默认就有不写也有 Unit相当于java 的void (关键字) 但是Unit是个类型，比关键字更牛叉
fun testUnit() :Unit{
return println("")//这个厉害了，都能写return
}

fun method04() {
//TODO("Not yet implemented")
    val code= 60
    val result = when (code) {
        -1 -> TODO()
        in 0..59 -> "不及格"  //in 包头包尾
        in 60..80 -> "及格"
        in 81..90 -> "良好"
        in 91..100 -> "优秀"
        else -> "不要养猪了，学习吧"
    }
    println(result)
}

fun `在反引号的加持下，方法名可以是汉字的`(type: String, age: Int) {
    println("汉字做方法名也可以使用，有加持时候")
}


fun `454566111GG`() {//这里面是核心代码（如算法、推广等）
    //公司内部文档对454566111GG有解释：XXXXXXX 这样即便别人反编译了也不知道这个方法是干嘛的
//    TODO("Not yet implemented")
}













